今天要先來幫昨天寫的 HelloRestController 加上簡單的測試啦
官方有提到因為有時會需要使用到 @BeforeAll 和 @AfterAll 在所有的測試
之前初始化,或測試後初始, 因為測試的 class 是這個 class 內每跑一個 test 就會做重新初始,以致於 @BeforeAll 和 @AfterAll 必須要是 static 的。
但在 Kotlin 中 static 的方法還需要宣告成 companion object ,為了避免這樣複雜的使用方式,於是 Junit 5 提供了一個 class 只初始化僅僅一次
的方式。
只要測試程式加上這句,就可以放心使用 @BeforeAll 和 @AfterAll 啦~
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
或是再 src/test/resources/junit-platform.properties
加入這行,這樣測試程式也可以全體適用
junit.jupiter.testinstance.lifecycle.default = per_class
像是這樣
這裡我們使用了 MockMvc 來做單純的 server 端的測試,也就是假的,不會去撈取 db 資料等等的測試,可以看到在 Kotlin 中推薦使用 check hello
(這符號叫做 backticks)這樣的函數命名方式來更清楚的來解釋測試的含義。
//@TestInstance(TestInstance.Lifecycle.PER_CLASS) 這句不加是因為,我已經在設定檔設定了。
@WebMvcTest(HelloRestController::class)
//@TestInstance(TestInstance.Lifecycle.PER_CLASS)
internal class HelloRestControllerTest(@Autowired val mockMvc: MockMvc) {
@Test
internal fun `check hello`() {
mockMvc.perform(
MockMvcRequestBuilders.get("/api/hello")
.accept(MediaType.APPLICATION_JSON)
)
.andDo(MockMvcResultHandlers.print())
.andExpect(MockMvcResultMatchers.status().isOk)
.andExpect(MockMvcResultMatchers.content().string("hello kotlin with spring"))
}
}
class HelloRestControllerTest(@Autowired val mockMvc: MockMvc)
這裡在 constructor 注入了 MockMvc
這個物件
當然也可以這樣寫來注入
internal class HelloRestControllerTest() {
@Autowired lateinit var mockMvc: MockMvc
在程式中我還提供了另一種寫法,也就是用 Kotlin DSL 來寫的語法,是不是簡潔許多呢?spring 不僅在 mockMvc 有提供 Kotlin DSL,在 router 和 spring security 也有提供 Kotlin DSL,日後會看到。
那不管用哪種方式,都是可行的。
來跑看看測試結果,測試通過!
以上就是第一個 Kotlin Spring Boot 的測試!
我們明天見!